/***********************************************************************
 * 描述: 	下拉框组件私有实现
 * File:    cxicombobox_p.h
 * Author:  chenanqi@mozihealthcare.cn
 * Date:    2025/10/14 10:53
 * Update:  
 **********************************************************************/

#ifndef COREXI_COMMON_PC_COMBOBOX_P_H
#define COREXI_COMMON_PC_COMBOBOX_P_H

#include <controls/combobox/cximuticombobox.h>

class QLineEdit;
class QWidget;
class QToolButton;
class QFrame;
class QListWidget;
class QHBoxLayout;
class QVBoxLayout;
class CxiTagWidget;
class QListWidgetItem;
class QCheckBox;
class CxiPopupBox;
class CxiComboBoxBase;

class CxiMutiComboBoxPrivate : public QObject
{
	Q_OBJECT
	Q_DISABLE_COPY(CxiMutiComboBoxPrivate)
	Q_DECLARE_PUBLIC(CxiMutiComboBox)
	explicit CxiMutiComboBoxPrivate(CxiMutiComboBox* p);
	~CxiMutiComboBoxPrivate() override;

	/**
	 * 显示/隐藏 下拉框
	 * @param visible 是否显示
	 */
	void setPopupVisible(bool visible);

	/**
	 * 添加项
	 * @param item 元素
	 */
	void addItem(const ComboItem& item);

private:
	/**
	 * 初始化UI
	 */
	void init();

	/**
	 * 初始化连接
	 */
	void initConnect();

	/**
	 * 处理项改变
	 * @param item 项
	 */
	void handleItemChanged(QListWidgetItem* item);

	/**
	 * 刷新标签布局
	 */
	void updateTagLayout();

	/**
	 * 刷新标签布局
	 */
	void refreshTagLayout();

	/**
	 * 添加标签方法
	 * @param text 标签的text
	 *
	 */
	void addTag(const QString& text);

	/**
	  * 删除标签方法
	  * @param text 标签的text
	  */
	void deleteTag(const QString& text);

	/**
	 * 是否显示全选复选框的方法
	 */
	void isShowSelectAllBox(bool isVisible);
	/**
	 * 全选方法
	 * @param state 状态参数
	 */
	void selectAllItem(int state);

	/**
	 * 模糊搜索Item
	 */
	 void searchItems();

	 /**
	  * 显示下拉框内容
	  */
	 void showPopup();

	 /**
	  * 获取存储位
	  * @return
	  */
	 QVector<QVariant> getTags() const;

	 /**
	  * 获取存储数据
	  * @return
	  */
	 QVector<QString> getDatas() const;

	 /**
	  * 显示更多项
	  */
	 void showMoreItems();

signals:
	// 删除标签信号
	void removeTag(const QString& text);

	// 显示全选复选框信号
	void visibleItemsChanged(bool isVisible);

	// 是否显示下拉按钮信号
	void isShowPopupButton(int count);

private:
	CxiMutiComboBox* q_ptr;
	// 组合框
	CxiComboBoxBase* m_comboBoxBase;
	// 全选
	QCheckBox* m_selectAll;
	// 分割线
	QFrame* m_line;
	// 展开项
	QFrame* m_popup;
	// 展示列表
	QListWidget* m_listWidget;
	// 顶部水平布局 包含了widget,搜索栏 和 下拉按钮
	QHBoxLayout* m_topLayout;
	// 全局的垂直布局
	QVBoxLayout* m_mainLayout;
	QVBoxLayout* m_popupLayout;
	// 存储的item数量
	int m_count;
	// 匹配的item数量
	int m_totalMatched;
	// +n 标签
	CxiPopupBox* m_popupBox;
	// 存储标签容器
	QVector<CxiTagWidget*>* m_tagWidgets;
	// 集合对Key去重
	QSet<QString>* m_existingTags;

	// 当前显示的item数量
	int m_visibleCount = 0;
	// 每次加载的数量
	const int m_batchSize = 200;
	// 防止重复触发加载
	bool m_loading = false;

};


#endif//COREXI_COMMON_PC_COMBOBOX_P_H
